#include"stack.h"

//初始化栈
void InitStack(SeqStack* s)
{
	//申请数据空间
	s->base = (ElemType*)malloc(sizeof(ElemType) * STACK_INIT_SIZE);
	assert(s->base != NULL);
	//设置容量的初始化大小
	s->capacity = STACK_INIT_SIZE;
	//设置栈顶的初始化指向
	s->top = 0;
}
//增加栈的容量空间
bool Inc(SeqStack* s)
{
	//在原来栈空间基础上扩展STACK_INC_SIZE大小的空间
	ElemType* newbase = (ElemType*)realloc(s->base, sizeof(ElemType) * (s->capacity + STACK_INC_SIZE));
	//如果扩展失败，提示失败并退出
	if (newbase == NULL)
	{
		cout << "内存不足,无法申请空间." << endl;
		return false;
	}
	//将栈的基址指向扩展后的空间
	s->base = newbase;
	//将栈现容量设置为原栈容量+扩展的容量
	s->capacity += STACK_INC_SIZE;
	return true;
}

//判断栈是否已满
bool IsFull(SeqStack* s)
{
	//如果栈顶top的值大于等于容量的大小，则表示栈满
	return s->top >= s->capacity;
}

//判断栈是否为空
bool IsEmpty(SeqStack* s)
{
	//如果栈顶top的值等于0，则表示栈为空
	return s->top == 0;
}

//入栈
void Push(SeqStack* s, ElemType x)
{
	//判断栈是否满了，如果不是真正意义上的满（还可以继续申请空间）则申请空间
	if (IsFull(s) && !Inc(s))
	{
		cout << "栈空间已满," << x << " 不能入栈."<<endl;
		return;
	}
	//栈未满，数据入栈（数据先入栈，然后top再加1）
	s->base[s->top++] = x;
}
//出栈
void Pop(SeqStack* s)
{
	//判断栈是否为空，如果为空不能出栈
	if (IsEmpty(s))
	{
		cout << "栈空间已空,不能出栈" << endl;
		return;
	}
	//将top值减一，模拟数据出栈
	s->top--;
}
//获取栈顶元素
bool GetTop(SeqStack* s, ElemType* v)
{
	//如果栈为空，则获取不了栈顶元素
	if (IsEmpty(s))
	{
		cout << "栈空间已空,不能取栈顶元素." << endl;
		return false;
	}
	//获取栈顶元素，top-1为栈顶元素所在栈的位置
	*v = s->base[s->top - 1];
	return true;
}

//打印栈内所有的数据
void Show(SeqStack* s)
{
	//由于栈内数据是后进先出的，所以打印数据时由顶向底打印
	for (int i = s->top - 1; i >= 0; --i)
	{
		cout << "栈中的元素：" << s->base[i] << endl;
	}
	cout << endl;
}
//获取栈内元素的个数
int Length(SeqStack* s)
{
	//top值可以表示栈内的元素个数
	return s->top;
}
//清空栈
void Clear(SeqStack* s)
{
	//将top的值设置为0，表示栈内已经没有元素
	s->top = 0;
}
//销毁栈
void Destroy(SeqStack* s)
{
	//释放栈内空间
	free(s->base);
	//将栈基址指为空
	s->base = NULL;
	//将栈容量和栈顶值设置为0
	s->capacity = s->top = 0;
}

void main()
{
	SeqStack st;
	InitStack(&st);

	ElemType v;
	int max,count;
	cout << "请输入你想要插入的数的数量：";
	cin >> max;
	cout << "请输入你想要插入的数：";
	for (int i = 1; i <= max; ++i)
	{
		cin >> count;
		Push(&st, count);
	}
	Show(&st);
	Clear(&st);
	Show(&st);

	Destroy(&st);
}
